﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlServerCe;
using ProjectEdificio.DataSetEdificioTableAdapters;
//using ProjectEdificio.DataVeryDificultDataSetTableAdapters;
using System.Data;
using System.Windows;
using System.Collections.ObjectModel;
using System.Data.Common;
using MySql.Data.MySqlClient;
using System.Configuration;

namespace ProjectEdificio
{
    class BDManagment
    {
        private DataSetEdificio dataset = null;
        private static BDManagment bdm = null;
        private String letra;
        


        //HashMap
        private Dictionary<String,Usuario> users = null;
        private Dictionary<String, Usuario> emails = null;
        private Dictionary<int, Cochera> cocherasForIDInquilino = null;
        private Dictionary<int, Inquilino> inquilinosForIDInquilino = null;


        //adapters
        
        private UsersTableAdapter userAdapter = null;
        private InquilinosTableAdapter inquilinosAdapter = null;
        private CocherasTableAdapter cocherasAdapter = null;
        private ServiciosTableAdapter serviciosAdapter = null;
        private ExpensasGneralTableAdapter expensasGneralAdapter = null;
        private ExpensasTableAdapter expensaAdapter = null;
        private ConfigurationsTableAdapter configurationsAdapter = null;
        private FacturasTableAdapter factureAdapter = null;
        private PagosFacturasTableAdapter pagoFacturasAdapter = null;

        
        
        
        private MySqlConnection conexion = null;

        //listas
        private ObservableCollection<Inquilino> inquilinosporPiso = null;
        private ObservableCollection<Inquilino> inquiliAll = null;
        private ObservableCollection<Cochera> listaCocheras = null;
        private ObservableCollection<Factura> listaFacturas = null;



        private BDManagment(){
            try
            {
                conexion = new MySqlConnection("server=localhost;User Id=root;Password=root;Persist Security Info=True;database=bdatosedificio");
                               
                loadData();
                
                chargeUsersinList();

                cargarListas();
            }
            catch(MySqlException e)
            {
                MessageBox.Show(e.ToString());
            }

            
        }

        private void cargarListas()
        {
            cargarListCocheras();
            generateAllInquilinos();
            generateDptos();
            generateFactureinList();
        }

        private void loadData()
        {
            dataset = new DataSetEdificio();

            inquilinosAdapter = new InquilinosTableAdapter();
            userAdapter = new UsersTableAdapter();
            cocherasAdapter = new CocherasTableAdapter();
            serviciosAdapter = new ServiciosTableAdapter();
            expensasGneralAdapter = new ExpensasGneralTableAdapter();
            expensaAdapter = new ExpensasTableAdapter();
            configurationsAdapter = new ConfigurationsTableAdapter();
            factureAdapter = new FacturasTableAdapter();
            pagoFacturasAdapter = new PagosFacturasTableAdapter();

            cocherasAdapter.Fill(this.dataset.Cocheras);
            inquilinosAdapter.Fill(this.dataset.Inquilinos);
            userAdapter.Fill(this.dataset.Users);
            serviciosAdapter.Fill(dataset.Servicios);
            expensasGneralAdapter.Fill(dataset.ExpensasGneral);
            expensaAdapter.Fill(dataset.Expensas);
            configurationsAdapter.Fill(dataset.Configurations);
            factureAdapter.Fill(dataset.Facturas);
            pagoFacturasAdapter.Fill(dataset.PagosFacturas);
        }

        public void pagarFacture(Factura f)
        {
            DataSetEdificio.PagosFacturasRow row = dataset.PagosFacturas.NewPagosFacturasRow();
            row.ID_Factura = f.ID_Factura;
            row.FechaPago = DateTime.Now;
            row.MontoPago = f.Gas + f.Agua + f.Expensas + f.Luz + f.MontoAlq + f.MontoCochera;

            dataset.PagosFacturas.AddPagosFacturasRow(row);
            pagoFacturasAdapter.Update(dataset.PagosFacturas);

            string query = "UPDATE facturas SET Estado='Pagado' WHERE ID_Factura='" + f.ID_Factura + "'";

            MySqlCommand updateFacture = new MySqlCommand(query, conexion);
            updateFacture.Connection.Open();
            updateFacture.ExecuteNonQuery();
            conexion.Close();
            factureAdapter.Fill(dataset.Facturas);
            cargarListas();
        }

        public void removeFacture(int IDFact)
        {
            string query = "DELETE FROM facturas WHERE ID_Factura='" + IDFact + "'";

            MySqlCommand deleteFacture = new MySqlCommand(query, conexion);
            deleteFacture.Connection.Open();
            deleteFacture.ExecuteNonQuery();
            conexion.Close();
            factureAdapter.Fill(dataset.Facturas);
            generateFactureinList();
            cargarListas();
        }

        public int addFactura(int idInquilino)
        {
            int flag = 0;
            Inquilino inqui = new Inquilino();
            Servicio servi = null;
            Expensa expensa = null;
            Cochera coch = new Cochera();


            inqui.ID_Inquilino = idInquilino;

            foreach (Inquilino rowinqui in inquiliAll)
            {
                if (rowinqui.ID_Inquilino == inqui.ID_Inquilino)
                {
                    inqui = rowinqui;
                    flag++;
                    break;
                }
            }

            foreach (DataSetEdificio.ServiciosRow rowservi in dataset.Servicios)
            {
                if (rowservi.ID_Inquilino == idInquilino)
                {
                    servi = new Servicio(idInquilino, rowservi.Agua, rowservi.Luz, rowservi.Gas);
                    flag++;
                    break;
                }
            }

            foreach (DataSetEdificio.ExpensasRow rowexpensa in dataset.Expensas)
            {
                if (idInquilino == rowexpensa.ID_Inquilino)
                {
                    if (!(rowexpensa["Portero1"] is DBNull)) //YEahhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
                    {
                        expensa = new Expensa(idInquilino, rowexpensa.FechaCreacion, rowexpensa.LuzComun, rowexpensa.AguaComun, rowexpensa.Portero1, rowexpensa.Portero2, rowexpensa.Sereno);
                        flag++;
                        break;
                    }
                }
            }

            foreach (Cochera co in listaCocheras)
            {
                if (idInquilino == co.ID_Inquilino)
                {
                    coch = co;
                    break;
                }
            }


            if (flag == 3)
            {
                addFacturePosta(inqui, expensa, servi, coch);
            }

            return flag;
        }

        private void addFacturePosta(Inquilino inqui, Expensa exp, Servicio servi, Cochera co)
        {

            float expensastotal = exp.AguaComun + exp.LuzComun + exp.Portero1 + exp.Portero2 + exp.Sereno;

            DataSetEdificio.FacturasRow row = dataset.Facturas.NewFacturasRow();
            row.Expensas = expensastotal;
            row.MontoAlq = inqui.Monto;
            row.ID_Inquilino = inqui.ID_Inquilino;
            row.MontoCochera = co.MontoCochera;
            row.Agua = servi.Agua;
            row.Luz = servi.Luz;
            row.Gas = servi.Gas;
            if (DateTime.Now.Day >= 15)
            {
                row.DesdeFact = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 16);
                row.HastaFact = new DateTime(DateTime.Now.Year, DateTime.Now.Month + 1, 15);
            }
            else
            {
                row.DesdeFact = new DateTime(DateTime.Now.Year, DateTime.Now.Month - 1, 16);
                row.HastaFact = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 15);
            }
            
            row.FechaEmitida = DateTime.Now;
            row.Estado = "Debe";

            dataset.Facturas.AddFacturasRow(row);
            factureAdapter.Update(dataset.Facturas);
            factureAdapter.Fill(dataset.Facturas);
            generateFactureinList();
            cargarListas();
        }

        private void generateFactureinList()
        {
            listaFacturas = new ObservableCollection<Factura>();
            foreach (DataSetEdificio.FacturasRow row in dataset.Facturas)
            {
                Factura f = new Factura(row.ID_Factura, row.ID_Inquilino, row.MontoAlq, row.MontoCochera, row.Expensas, row.Agua, row.Luz, row.Gas, row.DesdeFact, row.HastaFact, row.FechaEmitida, row.Estado);
                foreach (DataSetEdificio.PagosFacturasRow raw in dataset.PagosFacturas)
                {
                    if (f.ID_Factura == raw.ID_Factura)
                    {
                        f.FechaPago = raw.FechaPago;
                        f.Estado = "Pagado";
                        break;
                    }
                }
                Inquilino i = inquilinosForIDInquilino[f.ID_Inquilino];
                f.Nombre = i.Nombre;
                f.Apellido = i.Apellido;
                f.DNI = i.DNI;
                listaFacturas.Add(f);
            }
        }

        public ObservableCollection<Factura> getListFacturasForID(int id)
        {
            ObservableCollection<Factura> lista = new ObservableCollection<Factura>();
            generateFactureinList();
            foreach (Factura f in listaFacturas)
            {
                if (id == f.ID_Inquilino)
                {
                    lista.Add(f);
                }
            }
            return lista;
        }

        public ObservableCollection<Factura> listFacturas()
        {
            return listaFacturas;
        }

        public Configure getPreferencias()
        {
            Configure config = new Configure();
            foreach (DataSetEdificio.ConfigurationsRow row in dataset.Configurations)
            {
                config.PorUnaPieza = row.Por1Pieza;
                config.PorDosPiezas = row.Por2Piezas;
                config.PorTresPiezas = row.Por3Piezas;
            }
            return config;
        }

        public void editConfigure(Configure config)
        {
            if (dataset.Configurations.Count == 0)
            {
                DataSetEdificio.ConfigurationsRow fila = dataset.Configurations.NewConfigurationsRow();
                fila.Por1Pieza = config.PorUnaPieza;
                fila.Por2Piezas = config.PorDosPiezas;
                fila.Por3Piezas = config.PorTresPiezas;
                dataset.Configurations.AddConfigurationsRow(fila);
                configurationsAdapter.Update(dataset.Configurations);
                configurationsAdapter.Fill(dataset.Configurations);
            }
            else
            {
                foreach (DataSetEdificio.ConfigurationsRow row in dataset.Configurations)
                {
                    row.Por1Pieza = config.PorUnaPieza;
                    row.Por2Piezas = config.PorDosPiezas;
                    row.Por3Piezas = config.PorTresPiezas;
                    configurationsAdapter.Update(dataset.Configurations);
                    configurationsAdapter.Fill(dataset.Configurations);
                    break;
                }
            }
                
        }
        
        public bool comprobateExpensas()
        {
            bool flag = false;
            ExpensaGneral exp = getUltimaExpensasGneral();
            if (exp.FechaRedaccion.Month == DateTime.Now.Month && exp.AguaComun != 0 && exp.LuzComun != 0 && exp.Portero1 != 0 && exp.Portero2 != 0 && exp.Sereno != 0)
            {
                flag = true;
            }
            return flag;
        }
        
        public void generateExpensas()
        {
            ExpensaGneral expensagral = getUltimaExpensasGneral();
            int cantidadActivos = 0;
            int cantidad1Pieza = 0;
            int cantidad2Piezas = 0;
            int cantidad3Piezas = 0;

            foreach (DataSetEdificio.InquilinosRow row in dataset.Inquilinos)
            {
                if (row.Deleted == 0)
                {
                    cantidadActivos++;
                    if (row.LetraPiso == "A" || row.LetraPiso == "B")
                    {
                        cantidad2Piezas++;
                    } 
                    if (row.LetraPiso == "C")
                    {
                        cantidad3Piezas++;
                    }
                    if (row.LetraPiso == "D")
                    {
                        cantidad1Pieza++;
                    }
                }
            }

            float aguatotal = expensagral.AguaComun;
            float porcentaje20 = (aguatotal * 20) / 100;
            float porcentaje1pieza = 0;
            float porcentaje2pieza = 0;
            float porcentaje3pieza = 0;

            aguatotal = aguatotal - porcentaje20;

            Configure c = getPreferencias();

            porcentaje1pieza = (aguatotal * c.PorUnaPieza) / 100;
            porcentaje2pieza = (aguatotal * c.PorDosPiezas) / 100;
            porcentaje3pieza = (aguatotal * c.PorTresPiezas) / 100;

            if (cantidad1Pieza != 0)
            {
                porcentaje1pieza = porcentaje1pieza / cantidad1Pieza;
            }

            if (cantidad2Piezas != 0)
            {
                porcentaje2pieza = porcentaje2pieza / cantidad2Piezas;
            }
            if (cantidad3Piezas != 0)
            {
                porcentaje3pieza = porcentaje3pieza / cantidad3Piezas;
            }
            
            porcentaje20 = porcentaje20 / cantidadActivos;

            float luzcomuntotal = expensagral.LuzComun / cantidadActivos;
            float portero1total = expensagral.Portero1 / cantidadActivos;
            float portero2total = expensagral.Portero2 / cantidadActivos;
            float serenoTotal = expensagral.Sereno / cantidadActivos;

            foreach (DataSetEdificio.InquilinosRow inquilinosFila in dataset.Inquilinos)
            {
                if (inquilinosFila.Deleted == 0)
                {
                    if (inquilinosFila.LetraPiso == "A" || inquilinosFila.LetraPiso == "B")
                    {
                        foreach (DataSetEdificio.ExpensasRow rowexpensas in dataset.Expensas)
                        {
                            if (rowexpensas.ID_Inquilino == inquilinosFila.ID_Inquilino)
                            {
                                Expensa exp = new Expensa(inquilinosFila.ID_Inquilino, DateTime.Now, luzcomuntotal, porcentaje20 + porcentaje2pieza, portero1total, portero2total, serenoTotal);
                                exp.ID_Expensa = rowexpensas.ID_Expensa;
                                actualizeExpensa(exp);
                                break;
                            }
                        }
                    }

                    if (inquilinosFila.LetraPiso == "C")
                    {
                        foreach (DataSetEdificio.ExpensasRow rowexpensas in dataset.Expensas)
                        {
                            if (rowexpensas.ID_Inquilino == inquilinosFila.ID_Inquilino)
                            {
                                Expensa exp = new Expensa(inquilinosFila.ID_Inquilino, DateTime.Now, luzcomuntotal, porcentaje20 + porcentaje3pieza, portero1total, portero2total, serenoTotal);
                                exp.ID_Expensa = rowexpensas.ID_Expensa;
                                actualizeExpensa(exp);
                                break;
                            }
                        }
                    }
                    if (inquilinosFila.LetraPiso == "D")
                    {
                        foreach (DataSetEdificio.ExpensasRow rowexpensas in dataset.Expensas)
                        {
                            if (rowexpensas.ID_Inquilino == inquilinosFila.ID_Inquilino)
                            {
                                Expensa exp = new Expensa(inquilinosFila.ID_Inquilino, DateTime.Now, luzcomuntotal, porcentaje20 + porcentaje1pieza, portero1total, portero2total, serenoTotal);
                                exp.ID_Expensa = rowexpensas.ID_Expensa;
                                actualizeExpensa(exp);
                                break;
                            }
                        }
                    }
                }
            }
        }

        private void actualizeExpensa(Expensa exp)
        {
            string[] LuzComunSplit = exp.LuzComun.ToString().Split(',');
            string LuzComun = string.Empty;
            if (LuzComunSplit.Length == 2)
            {
                LuzComun = LuzComunSplit[0] + "." + LuzComunSplit[1];
            }
            else
            {
                LuzComun = LuzComunSplit[0];
            }


            string[] AguaComunSplit = exp.AguaComun.ToString().Split(',');
            string AguaComun = string.Empty;
            if (AguaComunSplit.Length == 2)
            {
                AguaComun = AguaComunSplit[0] + "." + AguaComunSplit[1];
            }
            else
            {
                AguaComun = AguaComunSplit[0];
            }


            string[] Portero1Split = exp.Portero1.ToString().Split(',');
            string Portero1 = string.Empty;
            if (Portero1Split.Length == 2)
            {
                Portero1 = Portero1Split[0] + "." + Portero1Split[1];
            }
            else
            {
                Portero1 = Portero1Split[0];
            }

            string[] Portero2Split = exp.Portero2.ToString().Split(',');
            string Portero2 = string.Empty;
            if (Portero2Split.Length == 2)
            {
                Portero2 = Portero2Split[0] + "." + Portero2Split[1];
            }
            else
            {
                Portero2 = Portero2Split[0];
            }

            string[] SerenoSplit = exp.Sereno.ToString().Split(',');
            string Sereno = string.Empty;
            if (SerenoSplit.Length == 2)
            {
                Sereno = SerenoSplit[0] + "." + SerenoSplit[1];
            }
            else
            {
                Sereno = SerenoSplit[0];
            }





            string updatestring = "UPDATE expensas SET FechaCreacion='" + exp.FechaCreacion.Year + "-" + exp.FechaCreacion.Month + "-" + exp.FechaCreacion.Day + "', LuzComun='" + LuzComun + "', AguaComun='" + AguaComun + "', Portero1='" + Portero1 + "', Portero2='" + Portero2 + "', Sereno='" + Sereno + "' WHERE ID_Expensa='" + exp.ID_Expensa + "'";

            MySqlCommand update = new MySqlCommand(updatestring, conexion);
            update.Connection.Open();
            update.ExecuteNonQuery();
            conexion.Close();

            expensaAdapter.Fill(dataset.Expensas);
        }
        
        public void addExpensaGneral(ExpensaGneral expensa)
        {
            DataSetEdificio.ExpensasGneralRow row = dataset.ExpensasGneral.NewExpensasGneralRow();
            row.AguaComun = expensa.AguaComun;
            row.LuzComun = expensa.LuzComun;
            row.Portero1 = expensa.Portero1;
            row.Portero2 = expensa.Portero2;
            row.Sereno = expensa.Sereno;
            row.FechaRedaccion = expensa.FechaRedaccion;

            dataset.ExpensasGneral.AddExpensasGneralRow(row);
            expensasGneralAdapter.Update(dataset.ExpensasGneral);
            expensasGneralAdapter.Fill(dataset.ExpensasGneral);

            //dpto A 2 y B 2.
            //C 3 y D 1.
        }
        
        public void editExpensaGneral(ExpensaGneral expensa)
        {
            foreach (DataSetEdificio.ExpensasGneralRow row in dataset.ExpensasGneral)
            {
                if (expensa.ID_ExpensaGral == row.ID_ExpensaGral)
                {
                    row.AguaComun = expensa.AguaComun;
                    row.LuzComun = expensa.LuzComun;
                    row.Portero1 = expensa.Portero1;
                    row.Portero2 = expensa.Portero2;
                    row.Sereno = expensa.Sereno;
                    expensasGneralAdapter.Update(dataset.ExpensasGneral);
                    expensasGneralAdapter.Fill(dataset.ExpensasGneral);
                    break;
                }
            }

        }
        
        public ExpensaGneral getUltimaExpensasGneral()
        {
            ExpensaGneral expensa = null;
            if (dataset.ExpensasGneral.Rows.Count != 0)
            {
                expensa = new ExpensaGneral();
                foreach (DataSetEdificio.ExpensasGneralRow row in dataset.ExpensasGneral)
                {
                    if (row.FechaRedaccion > expensa.FechaRedaccion)
                    {
                        expensa.ID_ExpensaGral = row.ID_ExpensaGral;
                        expensa.AguaComun = row.AguaComun;
                        expensa.LuzComun = row.LuzComun;
                        expensa.Portero1 = row.Portero1;
                        expensa.Portero2 = row.Portero2;
                        expensa.Sereno = row.Sereno;
                        expensa.FechaRedaccion = row.FechaRedaccion;
                    }
                }
            }
            return expensa;
        }
        
        public void addService(Servicio servi)
        {
            DataSetEdificio.ServiciosRow row = dataset.Servicios.NewServiciosRow();
            row.ID_Inquilino = servi.ID_Inquilino;
            row.Agua = servi.Agua;
            row.Gas = servi.Gas;
            row.Luz = servi.Luz;

            dataset.Servicios.AddServiciosRow(row);
            serviciosAdapter.Update(dataset.Servicios);
            serviciosAdapter.Fill(dataset.Servicios);
        }

        public void editService(Servicio servi)
        {
            foreach (DataSetEdificio.ServiciosRow row in dataset.Servicios)
            {
                if (servi.ID_Inquilino == row.ID_Inquilino)
                {
                    row.Agua = servi.Agua;
                    row.Gas = servi.Gas;
                    row.Luz = servi.Luz;

                    serviciosAdapter.Update(dataset.Servicios);
                    serviciosAdapter.Fill(dataset.Servicios);
                    break;
                }

            }
        }

        public Servicio searchService(int IDInquilino)
        {
            Servicio s = null;
            foreach (DataSetEdificio.ServiciosRow row in dataset.Servicios)
            {
                if (IDInquilino == row.ID_Inquilino)
                {
                    s = new Servicio(row.ID_Inquilino, row.Agua, row.Luz, row.Gas);
                    break;
                }
            }
            return s;
        }
        
        private void cargarListCocheras()
        {
            listaCocheras = new ObservableCollection<Cochera>();
            cocherasForIDInquilino = new Dictionary<int, Cochera>();

            for (int i = 1; i <= 10; i++)
            {
                Cochera coch = new Cochera(i);
                foreach (DataSetEdificio.CocherasRow row in dataset.Cocheras)
                {
                    if (row.MontoCochera != 0 && row.NumCochera == i)
                    {
                        coch = new Cochera(row.ID_Cocheras, row.ID_Inquilino, row.NumCochera, row.MontoCochera, row.DesdeCochera, row.HastaCochera);
                        foreach (DataSetEdificio.InquilinosRow rowInquilino in dataset.Inquilinos)
                        {
                            if (rowInquilino.ID_Inquilino == row.ID_Inquilino)
                            {
                                coch.Nombre = rowInquilino.Nombre;
                                coch.Apellido = rowInquilino.Apellido;
                                coch.DNI = rowInquilino.DNI;
                            }
                        }
                        cocherasForIDInquilino.Add(row.ID_Inquilino, coch);
                    }
                    //if (row.MontoCochera == null && row.NumCochera == i)
                    //{
                        
                    //    //row.Delete();
                    //}
                }
                listaCocheras.Add(coch);
            }
            //cocherasAdapter.Update(dataset.Cocheras);
        }

        public ObservableCollection<Cochera> getListaCocheras()
        {
            return listaCocheras;
        }

        public void addCochera(Cochera coch)
        {
            DataSetEdificio.CocherasRow row = dataset.Cocheras.NewCocherasRow();
            row.DesdeCochera = coch.DesdeCochera;
            row.HastaCochera = coch.HastaCochera;
            row.MontoCochera = coch.MontoCochera;
            row.NumCochera = coch.NumCochera;
            row.ID_Inquilino = coch.ID_Inquilino;

            dataset.Cocheras.AddCocherasRow(row);
            cocherasAdapter.Update(dataset.Cocheras);
            cocherasAdapter.Fill(this.dataset.Cocheras);

            cargarListas();
        }

        public void deleteCochera(int IDInquilino)
        {
            foreach (DataSetEdificio.CocherasRow row in dataset.Cocheras)
            {
                if (row.ID_Inquilino == IDInquilino)
                {
                    row.Delete();
                    cocherasAdapter.Update(dataset.Cocheras);
                    cocherasAdapter.Fill(this.dataset.Cocheras);
                    break;
                }
            }

            cargarListas();

        }

        public ObservableCollection<Inquilino> getDptos()
        {
            return inquilinosporPiso;
        }

        private void generateAllInquilinos()
        {
            inquiliAll = new ObservableCollection<Inquilino>();
            inquilinosForIDInquilino = new Dictionary<int, Inquilino>();

            Inquilino inquiAll;
            foreach (DataSetEdificio.InquilinosRow row in dataset.Inquilinos)
            {
                int numCochera = 0;
                if (cocherasForIDInquilino.ContainsKey(row.ID_Inquilino))
                {
                    numCochera = cocherasForIDInquilino[row.ID_Inquilino].NumCochera;
                }
                inquiAll = new Inquilino(row.ID_Inquilino, row.Apellido, row.Nombre, row.DNI, row.Telefono, row.Email, row.Desde, row.Hasta, row.NumPiso, row.LetraPiso, row.Monto, row.Deleted, numCochera);
                if (row.Deleted == 0)
                {
                    inquiAll.Activo = "Si";
                }
                else
                {
                    inquiAll.Activo = "No";
                }
                inquiliAll.Add(inquiAll);
                inquilinosForIDInquilino.Add(inquiAll.ID_Inquilino, inquiAll);
            }
        }

        public ObservableCollection<Inquilino> getAllInquilinos()
        {
            return inquiliAll;
        }

        private void generateDptos()
        {
            inquilinosporPiso = new ObservableCollection<Inquilino>();
            for (int i = 1; i <= 12; i++)
            {
                for (int j = 1; j <= 4; j++)
                {
                    Inquilino inqui = new Inquilino(i,comprobarLetra(j));
                    
                    foreach (DataSetEdificio.InquilinosRow row in dataset.Inquilinos)
                    {
                        int numCochera = 0;
                        
                        if(row.NumPiso == i && row.LetraPiso == comprobarLetra(j))
                        {

                            if (row.Deleted == 0)
                            {
                                if (row.Desde <= DateTime.Now && row.Hasta >= DateTime.Now)
                                {
                                    if (cocherasForIDInquilino.ContainsKey(row.ID_Inquilino))
                                    {
                                        numCochera = cocherasForIDInquilino[row.ID_Inquilino].NumCochera;
                                    }
                                    inqui = new Inquilino(row.ID_Inquilino, row.Apellido, row.Nombre, row.DNI, row.Telefono, row.Email, row.Desde, row.Hasta, row.NumPiso, row.LetraPiso, row.Monto, row.Deleted, numCochera);
                                }
                                else
                                {
                                    if (cocherasForIDInquilino.ContainsKey(row.ID_Inquilino))
                                    {
                                        deleteCochera(cocherasForIDInquilino[row.ID_Inquilino].ID_Inquilino);
                                    }
                                    row.Deleted = 1;
                                    inquilinosAdapter.Update(dataset.Inquilinos);
                                }
                            } 
                            else
                            {
                                if (cocherasForIDInquilino.ContainsKey(row.ID_Inquilino))
                                {
                                    deleteCochera(cocherasForIDInquilino[row.ID_Inquilino].ID_Inquilino);
                                }
                            }
                            
                        }
                    }
                    if (inqui.Apellido != null)
                    {
                        inqui.EstadoFinanciero = "Al dia";
                        foreach (DataSetEdificio.FacturasRow f in dataset.Facturas)
                        {
                            if (f.ID_Inquilino == inqui.ID_Inquilino)
                            {
                                if (f.Estado == "Debe")
                                {
                                    inqui.EstadoFinanciero = "Moroso";
                                }
                            }
                        }
                    }
                    

                    inquilinosporPiso.Add(inqui);
                }
            }
            rellenarHab();
        }

        private void rellenarHab()
        {
            foreach (Inquilino inqui in inquilinosporPiso)
            {
                
                switch (inqui.LetraPiso)
                {
                    case "A":
                        inqui.CantHab = 2;
                        break;
                    case "B":
                        inqui.CantHab = 2;
                        break;
                    case "C":
                        inqui.CantHab = 3;
                        break;
                    case "D":
                        inqui.CantHab = 1;
                        break;
                }

            }
        }
        
        public void addInquilinoInDpto(Inquilino inqui)
        {
            DataSetEdificio.InquilinosRow row = dataset.Inquilinos.NewInquilinosRow();
            row.Apellido = inqui.Apellido;
            row.Nombre = inqui.Nombre;
            row.DNI = inqui.DNI;
            row.Email = inqui.Email;
            row.LetraPiso = inqui.LetraPiso;
            row.NumPiso = inqui.NumPiso;
            row.Telefono = double.Parse(inqui.Telefono.ToString());
            row.Deleted = inqui.Deleted;
            row.Desde = inqui.Desde;
            row.Hasta = inqui.Hasta;
            row.Monto = inqui.Monto;

            int id = row.NumPiso;
            string letra = row.LetraPiso;

            dataset.Inquilinos.AddInquilinosRow(row);
            inquilinosAdapter.Update(dataset.Inquilinos);
            inquilinosAdapter.Fill(this.dataset.Inquilinos);


            DataSetEdificio.ExpensasRow fila = dataset.Expensas.NewExpensasRow();
            fila.ID_Inquilino = searchIDInquilinoForPisoyLetra(id, letra);
            dataset.Expensas.AddExpensasRow(fila);

            expensaAdapter.Update(dataset.Expensas);
            expensaAdapter.Fill(dataset.Expensas);
            cargarListas();
        }

        public int searchIDInquilinoForPisoyLetra(int NumPiso, String LetraPiso)
        {
            int IDInquilino = 0;
            foreach (DataSetEdificio.InquilinosRow row in dataset.Inquilinos)
            {
                if (row.NumPiso == NumPiso && row.LetraPiso == LetraPiso && row.Deleted == 0)
                {
                    IDInquilino = row.ID_Inquilino;
                    break;
                }
            }
            return IDInquilino;
        }

        //public void deleteInquilinoForEver(int IDInquilino)
        //{
        //    foreach (DataSetEdificio.InquilinosRow row in dataset.Inquilinos)
        //    {
        //        if (row.ID_Inquilino == IDInquilino)
        //        {
        //            row.Delete();
        //            inquilinosAdapter.Update(dataset.Inquilinos);
        //            break;
        //        }
        //    }
        //}
        
        public void deleteInquilino(int NumPiso, String Letra)
        {
            foreach (DataSetEdificio.InquilinosRow row in dataset.Inquilinos)
            {
                if (row.NumPiso == NumPiso && row.LetraPiso == Letra)
                {
                    row.Deleted = 1;
                    inquilinosAdapter.Update(dataset.Inquilinos);
                    inquilinosAdapter.Fill(dataset.Inquilinos);
                    break;
                }
            } 
            
            cargarListas();
        }

        public void editInquilino(Inquilino inqui)
        {
            foreach (DataSetEdificio.InquilinosRow row in dataset.Inquilinos)
            {
                if (row.ID_Inquilino == inqui.ID_Inquilino)
                {
                    row.Apellido = inqui.Apellido;
                    row.Nombre = inqui.Nombre;
                    row.DNI = inqui.DNI;
                    row.Telefono = int.Parse(inqui.Telefono.ToString());
                    row.Email = inqui.Email;
                    row.Monto = inqui.Monto;
                    row.Desde = inqui.Desde;
                    row.Hasta = inqui.Hasta;

                    inquilinosAdapter.Update(dataset.Inquilinos);
                    inquilinosAdapter.Fill(dataset.Inquilinos);
                    break;
                }
            }
            generateDptos();

        }

        private String comprobarLetra(int num)
        {
            switch (num)
            {
                case 1:
                    letra = "A";
                    break;
                case 2:
                    letra = "B";
                    break;
                case 3:
                    letra = "C";
                    break;
                case 4:
                    letra = "D";
                    break;
            }
            return letra;
        }
                
        private void chargeUsersinList()
        {
            users = new Dictionary<String, Usuario>();
            emails = new Dictionary<string, Usuario>();
            foreach (DataSetEdificio.UsersRow row in dataset.Users)
            {
                users.Add(row.UserName, new Usuario(row.UserName, row.Pass, row.Email, row.Range));
                emails.Add(row.Email, new Usuario(row.UserName, row.Pass, row.Email, row.Range));
            }
        }

        public static BDManagment getInstance() {
            if (bdm == null)
            {
                bdm = new BDManagment();
            }
            return bdm;
        }

        public Dictionary<String,Usuario> getListUsers()
        {
            return users;
        }

        public Dictionary<String, Usuario> getListEmails()
        {
            return emails;
        }

        public DataTable getDataTableUsers()
        {
            return dataset.Users;
        }

        public DataSetEdificio getDataSetEdificio()
        {
            return dataset;
        }

        public int addUser(Usuario u)
        {
            DataSetEdificio.UsersRow raw = dataset.Users.NewUsersRow();
            raw.UserName = u.User;
            raw.Pass = u.Pass;
            raw.Range = u.Range;
            raw.Job = u.Job;
            raw.Email = u.Email;
            dataset.Users.AddUsersRow(raw);
            int i = userAdapter.Update(dataset.Users);
            userAdapter.Fill(dataset.Users);
            users.Add(u.User, new Usuario(u.User, u.Pass, u.Email,u.Range));
            emails.Add(u.Email, new Usuario(u.User, u.Pass, u.Email,u.Range));
            return i;
        }

        public int clearUser(String u)
        {
            foreach (DataSetEdificio.UsersRow row in dataset.Users)
            {
                if (row.UserName == u)
                {
                    row.Delete();
                    break;
                }
            }
            int i = userAdapter.Update(dataset.Users);
            userAdapter.Fill(dataset.Users);
            this.chargeUsersinList();
            return i;
        }

        public int editUser(string uOld, string uNew, string p, string r, string j, string e)
        {
            int i = 0;
            foreach (DataSetEdificio.UsersRow row in dataset.Users)
            {
                if (row.UserName == uOld)
                {
                    row.UserName = uNew;
                    row.Pass = p;
                    row.Range = r;
                    row.Job = j;
                    row.Email = e;
                    i = userAdapter.Update(dataset);
                    userAdapter.Fill(dataset.Users);
                    this.chargeUsersinList();
                    return i;
                }
            }
            return i;
        }

    }
}
